package bancosys.tec.persist.persister.listener;

import bancosys.tec.persist.authorization.Authorizable;
import bancosys.tec.persist.persister.PersistenceAction;

/**
 * Extende {@link PersisterListener} para eventos de autorizalção e edicao de dados na base fria
 * 
 * @author takeshi
 * @param <T> o tipo da entidade.
 */
public interface AuthorizablePersisterListener<T extends Authorizable> extends PersisterListener<T> {

    /**
     * Chamado apos uma alteracao e um save() em um {@link Authorizable}, jogando o bean para a particao fria. A instancia passada esta
     * ATTACHED na sessao ativa.
     * 
     * @param action o {@link PersistenceAction}
     * @param coldInstance o bean já na base fria - já com ID
     */
    void afterInsertIntoColdPartition(PersistenceAction action, T coldInstance);

    /**
     * Chamado apos uma modificacao em uma instancia na particao fria.
     * 
     * @param target T
     */
    void afterUpdateColdInstance(T target);

    /**
     * Chamado antes de um bean ser autorizado.
     * 
     * @param action a {@link PersistenceAction} executada
     * @param target T o alvo
     */
    void beforeAuthorization(PersistenceAction action, T target);

    /**
     * Chamado antes de um bean ser autorizado.
     * 
     * @param action a {@link PersistenceAction} executada
     * @param target T o alvo
     */
    void beforeRejection(PersistenceAction action, T target);

}
